/**  
* @Title: BaseController.java <br>
* @Package com.xzit.ar.common.base <br>
* @Description: TODO <br>
* @author Mr.Black <br>
* @date 2015年12月21日 上午11:08:45 <br>
* @version V1.0 <br>
*/
package com.xzit.tmms.common.base;

import java.io.UnsupportedEncodingException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.xzit.tmms.common.constant.GlobalConstants;
import com.xzit.tmms.common.constant.WebConstant;
import com.xzit.tmms.common.exception.AssertException;
import com.xzit.tmms.common.util.Assert;
import com.xzit.tmms.common.util.CommonUtil;

/**
 * @ClassName: BaseController <br>
 * @Description: TODO <br>
 * @author Mr.Black <br>
 * @date 2015年12月21日 上午11:08:45 <br>
 * @version V1.0 <br>
 *          <br>
 */
public abstract class BaseController {

	/** 分页最大数 */
	private static final int MAX_PAGE_SIZE = 100;

	/** 分页最小数 */
	private static final int MIN_PAGE_SIZE = 5;

	/** 默认页大小 */
	private static final int DEFAULT_PAGE_SIZE = 10;

	/** 页面操作备注 */
	private static String OPERATE_REMARKS = "operateRemarks";

	/** 操作结果信息 */
	private static String OPERATE_REASULT_MESSAGE = "_message";

	/** 成功跳转页面 */
	private static String successPage = "error/page500";

	/** 失败跳转页面 */
	private static String errorPage = "error/page500";

	private static Logger logger = new Logger(BaseController.class);

	/**
	 * @Title: getParameter <br>
	 * @Description: TODO 获取参数<br>
	 * @param @throws
	 *            AssertException <br>
	 * @return String <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:28:56 <br>
	 * @throws <br>
	 */
	protected String getParameter(String param, String errMsg) throws AssertException {
		String value = getRequest().getParameter(param);
		if (errMsg != null) {
			Assert.notEmpty(value, errMsg);
		}
		return StringUtils.trim(value);
	}

	/**
	 * @Title: getParameter <br>
	 * @Description: TODO 获取参数<br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:11:27 <br>
	 * @throws <br>
	 */
	protected String getParameter(String param) {
		String value = getRequest().getParameter(param);
		if (CommonUtil.isNotEmpty(value)) {
			try {
				value = new String(value.getBytes("ISO-8859-1"), GlobalConstants.DEFAULT_CHARSET);
			} catch (UnsupportedEncodingException e) {
				logger.warn(e);
			}
		}
		return StringUtils.trim(value);
	}

	/**
	 * @Title: getLongParameter <br>
	 * @Description: TODO getLongParameter<br>
	 * @return Long <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:30:55 <br>
	 * @throws <br>
	 */
	protected Long getLongParameter(String param, String errMsg) throws AssertException {
		String value = getParameter(param, errMsg);
		return CommonUtil.isEmpty(value) ? null : Long.valueOf(value);
	}

	/**
	 * @Title: getLongParameter <br>
	 * @Description: TODO getLongParameter<br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:31:34 <br>
	 * @throws <br>
	 */
	protected Long getLongParameter(String param) {
		String value = getParameter(param);
		return CommonUtil.isEmpty(value) ? null : Long.valueOf(value);
	}

	/**
	 * @Description: TODO getIntegerParameter <br>
	 * @return Integer <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:32:44 <br>
	 */
	protected Integer getIntegerParameter(String param, String errMsg) throws AssertException {
		String value = getParameter(param, errMsg);
		return CommonUtil.isEmpty(value) ? null : Integer.valueOf(value);
	}

	/**
	 * @Description: TODO getIntegerParameter<br>
	 * @return Integer <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:33:23 <br>
	 */
	protected Integer getIntegerParameter(String param) {
		String value = getParameter(param);
		return CommonUtil.isEmpty(value) ? null : Integer.valueOf(value);
	}

	/**
	 * @Title: getQueryStr
	 * @Description: TODO 获取查询条件字符串
	 */
	protected String getQueryStr() {
		return this.getParameter("queryStr");
	}

	/**
	 * @Title: setQueryStr
	 * @Description: TODO 传递查询条件字符串
	 */
	protected void setQueryStr() {
		this.getRequest().setAttribute("queryStr", this.getParameter("queryStr"));
	}

	/**
	 * @Title: getStateStr
	 * @Description: TODO 获取查询条件字符串
	 */
	protected String getStateStr() {
		if (this.getParameter("stateStr") == null) {
			return "";
		} else {
			return this.getParameter("stateStr");
		}
	}

	/**
	 * @Title: setStateStr
	 * @Description: TODO 传递查询条件字符串
	 */
	protected void setStateStr() {
		this.getRequest().setAttribute("stateStr", this.getStateStr());
	}

	/**
	 * @Title: getSelectStr
	 * @Description: TODO 获取条件查询下拉框条件
	 */
	protected String getSelectStr() {
		return this.getParameter("selectStr");
	}

	/**
	 * @Title: setSelectStr
	 * @Description: TODO 返回条件查询下拉框条件
	 */
	protected void setSelectStr() {
		this.getRequest().setAttribute("selectStr", this.getParameter("selectStr"));
	}

	/**
	 * @Description: TODO getPageIndex<br>
	 * @param @return
	 *            <br>
	 * @return int <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:34:13 <br>
	 */
	protected int getPageIndex() {
		Integer pageIndex = getIntegerParameter("pageIndex");
		return (pageIndex == null || pageIndex < 1) ? 1 : pageIndex;
	}

	/**
	 * @Description: TODO getPageSize <br>
	 * @param @return
	 *            <br>
	 * @return int <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:34:22 <br>
	 */
	protected int getPageSize() {
		Integer pageSize = getIntegerParameter("pageSize");
		return (pageSize == null || pageSize < MIN_PAGE_SIZE || pageSize > MAX_PAGE_SIZE) ? DEFAULT_PAGE_SIZE
				: pageSize;
	}

	/**
	 * @Description: TODO 页面跳转成功处理<br>
	 * @return ModelAndView <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月23日 下午9:07:08 <br>
	 */
	protected ModelAndView success(String message, String redirectUrl, Map<String, String> param) {
		ModelMap map = new ModelMap();
		map.put("success", true);
		map.put("message", message);
		map.put("url", redirectUrl);
		map.put("paramMap", param);
		return new ModelAndView(successPage, map);
	}

	/**
	 * @Description: TODO 页面跳转失败处理<br>
	 * @return ModelAndView <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月23日 下午9:06:44 <br>
	 */
	protected ModelAndView fail(String errMessage, String redirectUrl, Map<String, String> param) {
		ModelMap map = new ModelMap();
		map.put("errMsg", errMessage);
		map.put("url", redirectUrl);

		if (param != null) {
			map.put(WebConstant.PAGE_NOT_REDIRECT, param.remove(WebConstant.PAGE_NOT_REDIRECT));
		}
		map.put("paramMap", param);
		return new ModelAndView(errorPage, map);
	}

	/**
	 * @Description: TODO 获取request<br>
	 * @param @return
	 *            <br>
	 * @return HttpServletRequest <br>
	 * @author Mr.Black <br>
	 * @date 2015年12月21日 下午1:36:56 <br>
	 */
	protected HttpServletRequest getRequest() {
		RequestAttributes requestAttr = RequestContextHolder.getRequestAttributes();
		return ((ServletRequestAttributes) requestAttr).getRequest();
	}

	/**
	 * @Title: getSession
	 * @Description: TODO 获取当前 Session
	 */
	protected HttpSession getSession() {
		return this.getRequest().getSession();
	}

	/**
	 * @Title: setOperateRemarks
	 * @Description: TODO 通过request设置操作备注
	 */
	protected void setOperateRemarks(String operateRemarks) {
		this.getRequest().setAttribute(OPERATE_REMARKS, operateRemarks);
	}

	/**
	 * @Description: TODO 添加页面操作说明<br>
	 * @author Mr.Black <br>
	 * @date 2015年12月26日 上午2:03:44 <br>
	 */
	protected void setOperateRemarks(Model model, String operateRemarks) {
		model.addAttribute(OPERATE_REMARKS, operateRemarks);
	}

	/**
	 * @Title: setMessage
	 * @Description: TODO 处理后存放处理结果信息
	 */
	protected void setMessage(String message) {
		this.getRequest().setAttribute("OPERATE_REASULT_MESSAGE", message);
	}

	/**
	 * @Description: TODO 向页面返回操作结果信息 <br>
	 *               message 操作结果信息
	 * @author Mr.Black <br>
	 * @date 2015年12月27日 下午8:51:09 <br>
	 */
	protected void setMessage(Model model, String message) {
		if (model != null) {
			model.addAttribute(OPERATE_REASULT_MESSAGE, message);
		}
	}

	/**
	 * @Title: setMessage
	 * @Description: TODO 重定向传参数
	 */
	protected void setMessage(RedirectAttributes attr, String message) {
		if (attr != null) {
			attr.addAttribute(OPERATE_REASULT_MESSAGE, message);
		}
	}

	/**
	 * @Title: getCurrentUser
	 * @Description: TODO 获取当前用户
	 */
	@SuppressWarnings("unchecked")
	protected Map<String, Object> getCurrentUser() {
		Map<String, Object> user = null;
		// 普通用户
		user = (Map<String, Object>) getRequest().getSession().getAttribute(WebConstant.SESSION_USER);
		// 管理员用户
		if (CommonUtil.isEmpty(user)) {
			user = (Map<String, Object>) getRequest().getSession().getAttribute(WebConstant.SESSION_ADMIN);
		}
		return user;
	}

	/**
	 * @Title: getCurrentUserId
	 * @Description: TODO 获取当前用户 ID
	 */
	protected Integer getCurrentUserId() {
		Integer userId = null;
		if (CommonUtil.isNotEmpty(this.getCurrentUser())) {
			// 获取当前用户id
			userId = (Integer) this.getCurrentUser().get("userId");
		}
		return userId;
	}

}
